package app.modules.example.business.service;

import app.modules.example.constant.ExampleMsgConstants;
import app.modules.example.dto.web.WebExampleCheckDTO;
import app.modules.example.dto.web.WebExampleDTO;
import app.modules.example.dto.web.WebExampleQueryDTO;
import app.modules.example.dto.web.WebExampleSaveDTO;
import app.modules.example.dto.web.WebExampleUpdateDTO;
import app.modules.example.persistence.dao.ExampleDAO;
import app.modules.example.persistence.entity.ExampleEO;
import app.modules.example.util.conversion.ExampleConvertUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jasmine.framework.common.util.CheckUtil;
import jasmine.framework.common.util.CollectionUtil;
import jasmine.framework.common.util.I18nUtil;
import jasmine.framework.common.util.MapperUtil;
import jasmine.framework.common.util.StringUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.List;

/**
 * @author mh.z
 */
@Service
public class ExampleService implements IExampleService {
    private final ExampleDAO exampleDAO;

    public ExampleService(ExampleDAO exampleDAO) {
        this.exampleDAO = exampleDAO;
    }

    /**
     * 检查数据
     *
     * @param checkDTO
     * @return
     */
    public boolean checkData(WebExampleCheckDTO checkDTO) {
        CheckUtil.notNull(checkDTO, "checkDTO null");

        ExampleEO examplePO = exampleDAO.getById(checkDTO.getId());
        if (examplePO != null) {
            if (StringUtil.equals(examplePO.getExampleName(), checkDTO.getExampleName())) {
                return true;
            }
        }

        return false;
    }

    /**
     * 导入数据
     *
     * @param examples
     */
    @Transactional(rollbackFor = Exception.class)
    public void importExamples(List<ExampleEO> examples) {
        CheckUtil.notNull(examples, "examples null");

        exampleDAO.saveBatch(examples);
    }

    /**
     * 删除指定 ID 的记录
     *
     * @param recordId
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteRecordById(Long recordId) {
        CheckUtil.notNull(recordId, "recordId null");

        exampleDAO.deleteById(recordId);
    }

    /**
     * 批量删除指定 ID 的记录
     *
     * @param recordIds
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteRecordByIds(List<Long> recordIds) {
        CheckUtil.notNull(recordIds, "recordIds null");

        exampleDAO.deleteByIds(recordIds);
    }

    @Transactional(rollbackFor = Exception.class)
    public WebExampleDTO updateExample(WebExampleUpdateDTO updateDTO) {
        CheckUtil.notNull(updateDTO, "updateDTO null");
        CheckUtil.notNull(updateDTO.getExampleName(), "updateDTO.exampleName null");
        Long id = updateDTO.getId();
        ExampleEO exampleEO = exampleDAO.getById(id);

        MapperUtil.mapFields(updateDTO, exampleEO);
        exampleDAO.strictUpdateById(exampleEO);

        return getWebExampleDtoById(id);
    }

    @Transactional(rollbackFor = Exception.class)
    public WebExampleDTO saveExample(WebExampleSaveDTO dto) {
        CheckUtil.notNull(dto, "dto null");
        CheckUtil.notNull(dto.getExampleName(), "dto.exampleName null");

        ExampleEO exampleEO = new ExampleEO();
        MapperUtil.mapFields(dto, exampleEO);
        exampleDAO.save(exampleEO);

        return getWebExampleDtoById(exampleEO.getId());
    }

    /**
     * 查找指定 ID 的示例数据
     *
     * @param id
     * @return
     */
    public WebExampleDTO getWebExampleDtoById(Long id) {
        CheckUtil.notNull(id, "id null");

        ExampleEO example = exampleDAO.getById(id);
        WebExampleDTO exampleDTO = ExampleConvertUtil.exampleEO2WebExampleDTO(example);

        if (exampleDTO != null) {
            populateWebExampleDTOs(Collections.singletonList(exampleDTO));
        }

        return exampleDTO;
    }

    /**
     * 分页查询示例数据
     *
     * @param query
     * @param page
     * @return
     */
    public List<WebExampleDTO> pageWebExampleDTOsByCond(WebExampleQueryDTO query, Page page) {
        CheckUtil.notNull(query, "query null");
        CheckUtil.notNull(page, "page null");

        List<WebExampleDTO> recordList = exampleDAO.pageExamplesByCond(query, page);
        populateWebExampleDTOs(recordList);

        return recordList;
    }

    /**
     * 填充数据
     *
     * @param records
     */
    public void populateWebExampleDTOs(List<WebExampleDTO> records) {
        if (CollectionUtil.isEmpty(records)) {
            return;
        }

        String trueDesc = I18nUtil.getMessage(ExampleMsgConstants.ENABLE_FLAG_TRUE);
        String falseDesc = I18nUtil.getMessage(ExampleMsgConstants.ENABLE_FLAG_FALSE);

        records.forEach((record) -> {
            Boolean enableFlag = record.getEnableFlag();

            if (Boolean.TRUE.equals(enableFlag)) {
                record.setEnableFlagDesc(trueDesc);
            } else {
                record.setEnableFlagDesc(falseDesc);
            }
        });
    }

}
